package com.bailian.app.controller;

import com.bailian.common.core.controller.BaseController;
import com.bailian.app.util.UserContextUtil;
import com.bailian.app.util.ConnectionStatusUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;

/**
 * App模块Controller基类
 * 提供通用的用户信息获取方法
 * 
 * @author bailian
 */
public abstract class BaseAppController extends BaseController {

    private static final Logger log = LoggerFactory.getLogger(BaseAppController.class);

    /**
     * 获取当前登录用户ID
     * 
     * @return 用户ID
     * @throws RuntimeException 如果用户未登录
     */
    protected Long getCurrentUserId() {
        return UserContextUtil.getCurrentUserId();
    }

    /**
     * 获取当前登录用户ID，如果失败则返回null
     * 
     * @return 用户ID，如果获取失败则返回null
     */
    protected Long getCurrentUserIdOrNull() {
        return UserContextUtil.getCurrentUserIdOrNull();
    }

    /**
     * 检查当前用户是否已登录
     * 
     * @return true表示已登录，false表示未登录
     */
    protected boolean isUserLoggedIn() {
        return UserContextUtil.isUserLoggedIn();
    }

    /**
     * 获取当前HTTP请求对象
     * 
     * @return 当前HTTP请求对象
     */
    protected HttpServletRequest getCurrentRequest() {
        return UserContextUtil.getCurrentRequest();
    }

    /**
     * 检查客户端连接是否仍然有效
     * 
     * @return true表示连接有效，false表示连接已断开
     */
    protected boolean isClientConnected() {
        return ConnectionStatusUtil.isClientConnected();
    }

    /**
     * 检查并记录连接状态
     * 
     * @param operation 操作描述
     * @return true表示连接有效
     */
    protected boolean checkConnectionAndLog(String operation) {
        return ConnectionStatusUtil.checkConnectionAndLog(operation);
    }

    /**
     * 安全地执行操作，如果客户端断开则跳过
     * 
     * @param operation 操作描述
     * @param action 要执行的操作
     * @return true表示操作成功执行，false表示客户端已断开
     */
    protected boolean safeExecute(String operation, Runnable action) {
        if (!checkConnectionAndLog(operation)) {
            return false;
        }
        
        try {
            action.run();
            return true;
        } catch (Exception e) {
            log.error("执行操作'{}'时发生异常", operation, e);
            return false;
        }
    }
} 